其他
凡事留一手,MySQL配置读写分离
一.背景
1.什么是读写分离
读写分离从字面上就很好理解,读数据库和写数据库的操作分别执行,读或写操作分别用不同的计算机或计算机组来承担任务。可以参考下基础的架构图。
2.为什么要读写分离
还不是为了安全,读写分离为主从同步的一种备份方案,当主数据库出现问题的时候,从数据库可以代替主数据库,避免数据丢失,从而更加的安全。
进一步而言,当配置好主从复制后,我们就可以把两台机器做不同的用途,由于从机写入数据时不会同步到主机,因此把主机做写服务器,从机做读服务器,得以分散压力,使得数据库更稳定高效。(一般情况都是读操作更多)
3.下一步?
如果有多个读写服务器组,可以使用多主多从的方式建立,然后使用Nginx代理读和写组服务器,或使用HaProxy或LVS等来组建统一的访问入口,交给开发访问。
二、搭建
主从复制在前一期在复现过,这里来详细阐述my.cnf几个参数。
# 开启二进制日志
log-bin=mysql-bin
# 设置服务器id
server-id=1
# 使用binlog在每N次写入后与硬盘同步
sync-binlog=1
# 5天后自动清理二进制日志
expire_log_days=1
我这里简单搭建:
# 主服务器
docker run \
-p 12345:3306 \
--name mysql_master \
-v /opt/docker/mysql_master/conf:/etc/mysql/conf.d \
-v /opt/docker/mysql_master/logs:/logs \
-v /opt/docker/mysql_master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
docker run \
-p 12346:3306 \
--name mysql_node \
-v /opt/docker/mysql_node/conf:/etc/mysql/conf.d \
-v /opt/docker/mysql_node/logs:/logs \
-v /opt/docker/mysql_node/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
cat > /opt/docker/mysql_master/conf/my.cnf << EOF
[mysqld]
# 开启二进制日志
log-bin=mysql-bin
# 设置服务器id
server-id=1
# 使用binlog在每N次写入后与硬盘同步
sync-binlog=1
# 5天后自动清理二进制日志
expire_logs_days=5
EOF
cat > /opt/docker/mysql_node/conf/my.cnf << EOF
[mysqld]
server-id=2
EOF
重启生效
主节点上操作: 执行以下命令,主节点新建立用户,用于同步。
docker exec -it mysql_master /bin/bash
mysql -uroot -p123456
mysql> CREATE USER 'repl'@'%' identified by '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
docker restart mysql_master
docker restart mysql_node
# 回到shell 操作界面
quit
exit
从节点上操作:执行以下命令
docker exec -it mysql_node /bin/bash
# 把下面的ip换成你主节点的ip和端口
mysql -uroot -p123456
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.187', MASTER_PORT=12345,MASTER_USER='repl',MASTER_PASSWORD='123456';
# 启动同步
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
2-2-4:查看同步状态
mysql> show slave status \G;
如果没有报错,则部署成功。
验证
在主master上去创建数据库或新建表,加入数据,从节点很快接受到同步,同样的,如果在从node节点上去插入数据的话,主节点的数据无变化。这样就做好了读写分离的实验,后面我们把主master作为读/写节点,nodes作为读节点就好了。
往期推荐:
利用docker-compose脚本2分钟搭建一个属于自己博客的系统
MySQL配置主从复制,主主复制
利用Docker仅花1分钟时间安装好MySQL数据库